from django.shortcuts import render

# Create your views here.
# 验证码 和 短信验证码的 2个接口
from django_redis import get_redis_connection

from libs.captcha.captcha import captcha
from django.http import HttpResponse
from rest_framework.views import APIView

from verifications.serializer import RegisterSMSCodeSerializer


class RegisterImageCodeView(APIView):

    """
    生成图片验证码
    GET  verifications/imagecodes/(?P<image_code_id>.+)/
    image_code_id 是作为 判断 用户 输入的时候 查询 redis的依据
    image_code_id js生成的
    """""

    def get(self,request,image_code_id):

        """
        通过第三方库，生成图片和验证码，我们需要对验证码redis保存

        思路为：
        创建图片和验证码
        通过redis进行保存验证码，需要在设置中添加验证码数据库选项
        将图片返回
        """""

        # 创建图片和验证码
        text,image = captcha.generate_captcha()

        # 通过redis进行保存验证码

        # django - redis提供了get_redis_connection的方法，
        # 通过调用get_redis_connection方法传递redis的配置名称
        # 可获取到redis的连接对象，通过redis连接对象可以执行redis命令

        redis_conn = get_redis_connection('code')
        redis_conn.setex('img_%s'%image_code_id,60,text)

        # 将图片返回
        # 注意，图片是二进制，我们通过httpResponse返回
        return HttpResponse(image,content_type='image/jpeg')

from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework import status
from random import randint
from libs.yuntongxun.sms import CCP

class RegisterSMSCodeView(GenericAPIView):

    """
    获取短信验证码
    GET  /verifications/smscodes/(?P<>1[3-9]\d{9})/?text=xxx&image_code_id=xxx
    获取短信验证码，首先需要校验 验证码

    思路：
    创建序列化器，定义text 和 image_code_id
    redis 判断该用户是否频繁获取
    生成短信验证码
    redis增加记录
    发送短信
    返回响应
    """""

    serializer_class = RegisterSMSCodeSerializer

    def get(self,request,mobile):

        # 创建序列化器，定义text和image_code_id
        serializer = self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        # redis
        redis_conn = get_redis_connection('code')

        # 判断该用户是否频繁获取
        if redis_conn.get('sms_flag_%s'%mobile):
            return Response(status=status.HTTP_429_TOO_MANY_REQUESTS)

        # 生成短信验证码
        sms_code = '%06d'%randint(0,999999)

        # redis 增加记录
        redis_conn.setex('sms_%s'%mobile,5*60,sms_code)
        redis_conn.setex('sms_flag_%s'%mobile,60,1)

        # 发送短信
        ccp = CCP()
        ccp.send_template_sms(mobile,[sms_code,5],1)

        # 返回响应
        return Response({'message':'ok'})